/*
 * 版权所有 (C) 2015 知启蒙(ZHIQIM) 保留所有权利。[遇见知启蒙，邂逅框架梦]
 *
 * 知启蒙数据库映射（zhiqim_orm）在LGPL3.0协议下开源：https://www.zhiqim.com/gitcan/zhiqim/zhiqim_orm.htm
 *
 * This file is part of [zhiqim_orm].
 *
 * [zhiqim_orm] is free software: you can redistribute
 * it and/or modify it under the terms of the GNU Lesser General Public License
 * as published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * [zhiqim_orm] is distributed in the hope that it will
 * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with [zhiqim_orm].
 * If not, see <http://www.gnu.org/licenses/>.
 */
package com.xygz.orm;

import com.xygz.orm.exception.ORMException;
import com.xygz.orm.table.ZTable;
import com.xygz.orm.table.ZTableField;

import java.sql.SQLException;
import java.util.List;

/**
 * DDL英文全称是 Data Definition Language，数据定义语言，用来定义数据库对象(数据库，表，字段)
 *
 * @author xiyuan-lgz 2023-11-11 @version v1.0.0 新建与整理
 */
@SuppressWarnings("all")
public interface DDL {
    
    /**
     * 获取所有表名
     *
     * @return 数据库表名列表
     * @throws ORMException 异常信息
     * @throws SQLException 异常信息
     */
    public List<String> getTables() throws ORMException, SQLException;
    
    /*****************************************************/
    // table DDL语句
    /*****************************************************/
    
    /**
     * 是否存在[表类]对应的[实际表]
     *
     * @param table 数据库表名
     * @return =true表示存在，=false表示不存在
     * @throws ORMException 映射异常
     * @throws SQLException 数据库异常
     */
    public boolean exist(String table) throws ORMException, SQLException;
    
    /**
     * 是否已存在表
     *
     * @param table 表对象
     * @return =true表示存在，=false表示不存在
     * @throws SQLException 数据库异常
     * @throws ORMException ORM异常
     */
    public boolean exist(ZTable table) throws ORMException, SQLException;
    
    /**
     * 是否存在[表类]对应的[实际表]
     *
     * @param clz 表类
     * @return =true表示存在，=false表示不存在
     * @throws ORMException 异常信息
     * @throws SQLException SQL异常
     */
    public boolean exist(Class<?> clz) throws ORMException, SQLException;
    
    /**
     * 创建表
     *
     * @param table 表对象
     * @throws ORMException 异常信息
     * @throws SQLException SQL异常
     */
    public void create(ZTable table) throws ORMException, SQLException;
    
    /**
     * 查询表字段信息
     *
     * @param table 数据库表名
     * @return 表字段信息
     * @throws ORMException 异常信息
     * @throws SQLException SQL异常
     */
    public List<ZTableField> columns(String table) throws ORMException, SQLException;
    
    
    public void dropTable(String table) throws ORMException, SQLException;
    /**
     * 删除表
     *
     * @param table 表名
     * @param table 表对象
     * @throws SQLException 数据库异常
     * @throws ORMException ORM异常
     *                      public void dropTable(String table) throws ORMException, SQLException;
     *                      <p>
     *                      /**
     *                      删除表
     * @throws SQLException 数据库异常
     * @throws ORMException ORM异常
     */
    public void dropTable(ZTable table) throws ORMException, SQLException;
    
    
    /**
     * 删除表
     *
     * @param table 表类型
     * @throws SQLException 数据库异常
     * @throws ORMException ORM异常
     */
    public void dropTable(Class<?> table) throws ORMException, SQLException;
    
    /*****************************************************/
    // alter DDL语句
    /*****************************************************/
    
    /**
     * 修改一个表的名称
     *
     * @param table    表名
     * @param newTable 新表名
     * @throws SQLException 数据库异常
     * @throws ORMException ORM异常
     */
    public void renameTable(String table, String newTable) throws ORMException, SQLException;
    
    /**
     * 增加一个表的一列
     *
     * @param table   表名
     * @param column  列名
     * @param columns 列名 可变数组
     * @throws SQLException 数据库异常
     * @throws ORMException ORM异常
     */
    public void addColumn(String table, ZTableField column, ZTableField... columns) throws ORMException, SQLException;
    
    
    /**
     * 删除一个表的一列
     *
     * @param table  表名
     * @param column 列名
     * @throws SQLException 数据库异常
     * @throws ORMException ORM异常
     */
    public void dropColumn(String table, String column) throws ORMException, SQLException;
    
    /**
     * 修改一个表的一列信息
     *
     * @param table     表名
     * @param newColumn 新列名
     * @throws SQLException 数据库异常
     * @throws ORMException ORM异常
     */
    public void alterColumn(String table, ZTableField newColumn) throws ORMException, SQLException;
    
    
    /**
     * 增加表的主键
     *
     * @param table   表名
     * @param column  列名
     * @param columns 列名可变数组
     * @throws SQLException 数据库异常
     * @throws ORMException ORM异常
     */
    public void addPrimaryKey(String table, String column, String... columns) throws ORMException, SQLException;
    
    /**
     * 删除表的主键
     *
     * @param table 表名
     * @throws SQLException 数据库异常
     * @throws ORMException ORM异常
     */
    public void dropPrimaryKey(String table) throws ORMException, SQLException;
}
